package gestorbienraizok.inmuebles;

import gestorbienraizok.usuarios.ClienteOferente;
import java.util.LinkedList;
import static uiMain.bienRaizOk.convertirBooleano;
import static uiMain.bienRaizOk.formatearPrecio;

public class Casa extends Inmueble {

    private byte numeroPisos;
    private LinkedList<Garaje> listaGarajes;
    private Unidad unidad;

    public Casa(String codigo, byte numeroPisos, Unidad unidad, ClienteOferente propietario) {
        super(codigo, propietario);
        this.numeroPisos = numeroPisos;
        this.unidad = unidad;
        this.listaGarajes = new LinkedList();
    }

    public byte getNumeroPisos() {
        return this.numeroPisos;
    }

    public LinkedList<Garaje> getListaGarajes() {
        return this.listaGarajes;
    }

    public Unidad getUnidad() {
        return this.unidad;
    }

    public byte getEstrato() {
        return this.unidad.getEstrato();
    }

    public byte getCantidadDeGarajes() {
        return (byte) this.listaGarajes.size();
    }

    public void anhadirGaraje(Garaje garaje) {
        this.listaGarajes.add(garaje);
    }

    public String toStringParaBusquedaPorCriterios(boolean esParaArrendar) {
        String descripcion = new String();

        descripcion += String.format("%-9s",this.codigo);
        descripcion += String.format("%-19s",this.unidad.getDireccion());
        descripcion += String.format("%-28s",this.unidad.getNombre());
        if (esParaArrendar) {
            descripcion += formatearPrecio(this.getTarifaDeArrendamiento());
        } else {
            descripcion += formatearPrecio(this.getPrecioDeVenta());
        }
                
        return descripcion;
    }

    @Override
    public String toString() {
        String descripcion = new String();
        descripcion += "Código:            " + this.codigo + "\n";
        descripcion += "Área total:        " + this.areaTotal + " m2\n";
        descripcion += "Número de pisos:   " + this.numeroPisos + "\n";
        descripcion += "Patio:             " + convertirBooleano(this.patio) + "\n\n";

        byte numeroDePiezas = this.numeroDePiezas();
        byte numeroDeBanhos = this.numeroDeBanhos();
        byte cantidadDeGarajes = this.getCantidadDeGarajes();

        if (numeroDePiezas != 0 || numeroDeBanhos != 0 || cantidadDeGarajes != 0) {
            if (numeroDePiezas != 0) {
                descripcion += "Descripción de los espacios:\n";
                descripcion += "Espacio           Área (m2)\n";
                descripcion += "---------------------------\n";

                for (int i = 0; i < this.getListaCuartos().size(); i++) {
                    Cuarto esteCuarto = this.getListaCuartos().get(i);
                    if (esteCuarto instanceof Pieza) {
                        Pieza estaPieza = (Pieza) esteCuarto;
                        descripcion += String.format("%-18s", estaPieza.getUso());
                        descripcion += String.format("%-13.2f", estaPieza.getArea()) + "\n";
                    }
                }
                descripcion += "\n";
            }

            if (numeroDeBanhos != 0) {
                descripcion += "Descripción de los baños:\n";
                descripcion += "Baño     Área (m2)   Bañera     Ducha    Enchapado   Puerta ducha\n";
                descripcion += "-----------------------------------------------------------------\n";

                int numBanhos = 0;

                for (int i = 0; i < this.getListaCuartos().size(); i++) {
                    Cuarto esteCuarto = this.getListaCuartos().get(i);
                    if (esteCuarto instanceof Banho) {
                        numBanhos++;
                        Banho esteBanho = (Banho) esteCuarto;
                        descripcion += String.format("%-9d", numBanhos);
                        descripcion += String.format("%-12.2f", esteBanho.getArea());
                        descripcion += convertirBooleano(esteBanho.getBanhera()) + "         ";
                        descripcion += convertirBooleano(esteBanho.getDucha()) + "       ";
                        descripcion += convertirBooleano(esteBanho.getEnchapado()) + "          ";
                        descripcion += convertirBooleano(esteBanho.getPuertaDucha()) + "\n";
                    }
                }
                descripcion += "\n";
            }

            if (cantidadDeGarajes != 0) {
                descripcion += "Descripción de los garajes:\n";
                descripcion += "Garaje    Área (m2)   Altura (m)   Puerta eléctrica\n";
                descripcion += "---------------------------------------------------\n";

                for (int i = 0; i < this.getCantidadDeGarajes(); i++) {
                    Garaje esteGaraje = this.getListaGarajes().get(i);
                    descripcion += String.format("%-10d", i + 1);
                    descripcion += String.format("%-12.2f", esteGaraje.getArea());
                    descripcion += String.format("%-13.2f", esteGaraje.getAltura());
                    descripcion += convertirBooleano(esteGaraje.tienePuertaElectrica()) + "\n";
                }
                descripcion += "\n";
            }
        }

        descripcion += "Características de la unidad:\n";
        descripcion += this.unidad.toString();

        if (this.getDisponibilidad().equals("Disponible")) {

            if (this.getRol().equals("Venta")) {
                descripcion += "Esta propiedad está disponible para la venta:\n";
                descripcion += "Precio de venta:    " + formatearPrecio(this.precioDeVenta) + "\n";
            } else if (this.getRol().equals("Alquiler")) {
                descripcion += "Esta propiedad está disponible para arrendar:\n";
                descripcion += "Tarifa de arrendamiento:    " + formatearPrecio(this.tarifaDeArrendamiento) + " mensual (administración incluida)\n";
            } else if (this.getRol().equals("Venta y alquiler")) {
                descripcion += "Esta propiedad está disponible para la venta o para arrendar:\n";
                descripcion += "Precio de venta:            " + formatearPrecio(this.precioDeVenta) + "\n";
                descripcion += "Tarifa de arrendamiento:    " + formatearPrecio(this.tarifaDeArrendamiento) + " mensual (administración incluida)\n";
            } else {
                descripcion += "A esta propiedad no se la ha asignado un rol\n";
            }

        } else {
            descripcion += "Esta propiedad fue " + this.getDisponibilidad().toLowerCase();
        }
        return descripcion;
    }

}
